﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PandemiaAdmin.Soporte;
using PandemiaAdmin.Entidades;
using PandemiaAdmin.Transferencia;
using System.IO;

namespace PandemiaAdmin.Funcionalidad
{
    public class AdminNodos:Admin
    {
        public Servidor Servidor { get; set; }


        public AdminNodos(Servidor servidor)
        {
            Servidor = servidor;
        }

        public AdminNodos(string nombreServidor)
        {
            BLLServidor bll = new BLLServidor(Utilidades.ArchivoServidores);
            Servidor = bll.TraerServidor(nombreServidor);
        }


        public List<Nodo> TraerNodos()
        {
            string token = string.Empty;
            SoporteServiceClient cliente = GenerarTokenYCliente(Servidor, out token);
            string error = string.Empty;
            Nodo[] array = cliente.TraerNodos(out error, token);

            if (error.Length > 0)
                throw new ServicioException(error);

            List<Nodo> nodos;

            if (array != null && array.Length == 0)
                nodos = new List<Nodo>();
            else
                nodos = array.ToList();

            return nodos;
        }

        public ResultadoComando ObtenerResultado(int idComando)
        {
            string token = string.Empty;
            SoporteServiceClient cliente = GenerarTokenYCliente(Servidor, out token);
            string error = string.Empty;
            ResultadoComando resultado = cliente.ObtenerResultado(out error, idComando, token);

            if (error.Length > 0)
                throw new ServicioException(error);

            return resultado;
        }

        public int SolicitarAccion(Nodo nodo, TipoComando tipo, string path)
        {
            string token = string.Empty;
            SoporteServiceClient cliente = GenerarTokenYCliente(Servidor, out token);
            string error = string.Empty;
            int idComando = cliente.SolicitarAccion(out error, nodo, path, token, tipo);

            if (error.Length > 0)
                throw new ServicioException(error);

            return idComando;
        }

        public void SubirArchivo(string archivoLocal, string pathRemoto)
        {
            FileInfo info = new FileInfo(archivoLocal);
            FileStream stream = new FileStream(archivoLocal, FileMode.Open, FileAccess.Read);

            string token = string.Empty;
            TransferenciaServiceClient cliente = GenerarTokenYClienteTransferencia(Servidor, out token);
            string error = cliente.Subir(info.Name, stream);

            if (error != null && error.Length > 0)
                throw new ServicioException(error);
        }

        public void DescargarArchivo(string nombre, string carpetaParaGuardar)
        {
            string token = string.Empty;
            TransferenciaServiceClient cliente = GenerarTokenYClienteTransferencia(Servidor, out token);

            Stream stream = cliente.Descargar(ref nombre);

            int leidos = 0;
            int lenght = 2048;
            byte[] buffer = new byte[lenght];

            using (FileStream writer = new FileStream(carpetaParaGuardar + @"\" + nombre, FileMode.CreateNew, FileAccess.Write))
                do
                {
                    leidos = stream.Read(buffer, 0, lenght);
                    writer.Write(buffer, 0, leidos);
                } while (leidos != 0);
        }

        public bool NodoEstaOnline(Nodo nodo)
        {
            string token = string.Empty;
            SoporteServiceClient cliente = GenerarTokenYCliente(Servidor, out token);
            string error = string.Empty;

            return cliente.NodoEstaOnline(out error, nodo, token);
        }
    }
}
